using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._3DAnalystTools._TerrainDataset._Conversion
{
    /// <summary>
    /// <para>Terrain To Points</para>
    /// <para>Converts a terrain dataset into a new point or multipoint feature class.</para>
    /// <para>将 terrain 数据集转换为新的点或多点要素类。</para>
    /// </summary>    
    [DisplayName("Terrain To Points")]
    public class TerrainToPoints : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public TerrainToPoints()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_terrain">
        /// <para>Input Terrain</para>
        /// <para>The terrain dataset to process.</para>
        /// <para>要处理的 terrain 数据集。</para>
        /// </param>
        /// <param name="_out_feature_class">
        /// <para>Output Feature Class</para>
        /// <para>The feature class that will be produced.</para>
        /// <para>将生成的要素类。</para>
        /// </param>
        public TerrainToPoints(object _in_terrain, object _out_feature_class)
        {
            this._in_terrain = _in_terrain;
            this._out_feature_class = _out_feature_class;
        }
        public override string ToolboxName => "3D Analyst Tools";

        public override string ToolName => "Terrain To Points";

        public override string CallName => "3d.TerrainToPoints";

        public override List<string> AcceptEnvironments => ["XYResolution", "XYTolerance", "ZResolution", "ZTolerance", "autoCommit", "configKeyword", "extent", "geographicTransformations", "outputCoordinateSystem", "workspace"];

        public override object[] ParameterInfo => [_in_terrain, _out_feature_class, _pyramid_level_resolution, _source_embedded_feature_class, _out_geometry_type.GetGPValue()];

        /// <summary>
        /// <para>Input Terrain</para>
        /// <para>The terrain dataset to process.</para>
        /// <para>要处理的 terrain 数据集。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Terrain")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_terrain { get; set; }


        /// <summary>
        /// <para>Output Feature Class</para>
        /// <para>The feature class that will be produced.</para>
        /// <para>将生成的要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_feature_class { get; set; }


        /// <summary>
        /// <para>Pyramid Level Resolution</para>
        /// <para>The z-tolerance or window-size resolution of the terrain pyramid level that will be used. The default is 0, or full resolution.</para>
        /// <para>将使用的地形金字塔级别的 z 容差或窗口大小分辨率。默认值为 0，即全分辨率。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Pyramid Level Resolution")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _pyramid_level_resolution { get; set; } = 0;


        /// <summary>
        /// <para>Input Embedded Feature Class</para>
        /// <para>The name of the terrain dataset's embedded points to be exported. If an embedded feature is specified, only the points from the feature will be written to the output. Otherwise, all points from all data sources in the terrain will be exported.</para>
        /// <para>要导出的 terrain 数据集的嵌入点的名称。如果指定了嵌入要素，则只有该要素中的点才会写入输出。否则，将导出 terrain 中所有数据源中的所有点。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Embedded Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _source_embedded_feature_class { get; set; } = null;


        /// <summary>
        /// <para>Output Feature Class Type</para>
        /// <para><xdoc>
        ///   <para>The geometry of the output feature class.</para>
        ///   <bulletList>
        ///     <bullet_item>Multipoint—The output point features will be written to a multipoint feature class. This is the default.</bullet_item><para/>
        ///     <bullet_item>Point—The output point features will be written to a point feature class.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输出要素类的几何。</para>
        ///   <bulletList>
        ///     <bullet_item>多点 - 输出点要素将写入多点要素类。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>点—输出点要素将写入点要素类。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Feature Class Type")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _out_geometry_type_value _out_geometry_type { get; set; } = _out_geometry_type_value._MULTIPOINT;

        public enum _out_geometry_type_value
        {
            /// <summary>
            /// <para>Multipoint</para>
            /// <para>Multipoint—The output point features will be written to a multipoint feature class. This is the default.</para>
            /// <para>多点 - 输出点要素将写入多点要素类。这是默认设置。</para>
            /// </summary>
            [Description("Multipoint")]
            [GPEnumValue("MULTIPOINT")]
            _MULTIPOINT,

            /// <summary>
            /// <para>Point</para>
            /// <para>Point—The output point features will be written to a point feature class.</para>
            /// <para>点—输出点要素将写入点要素类。</para>
            /// </summary>
            [Description("Point")]
            [GPEnumValue("POINT")]
            _POINT,

        }

        public TerrainToPoints SetEnv(object XYResolution = null, object XYTolerance = null, object ZResolution = null, object ZTolerance = null, int? autoCommit = null, object configKeyword = null, object extent = null, object geographicTransformations = null, object outputCoordinateSystem = null, object workspace = null)
        {
            base.SetEnv(XYResolution: XYResolution, XYTolerance: XYTolerance, ZResolution: ZResolution, ZTolerance: ZTolerance, autoCommit: autoCommit, configKeyword: configKeyword, extent: extent, geographicTransformations: geographicTransformations, outputCoordinateSystem: outputCoordinateSystem, workspace: workspace);
            return this;
        }

    }

}